From: Jonas Dreßler Date: Mon, 19 Nov 2018 11:26:16 +0000 (+0100) Subject: extensionSystem: Always disable multiple extensions in reverse order X-Git-Tag: archive/raspbian/50.5-1+rpi1~1^2~811^2^2~96 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=bdcf3037ca2511118234c7d49001ceccbf4ef6f0;p=gnome-shell.git extensionSystem: Always disable multiple extensions in reverse order Since disabling an extension will lead to disabling and re-enabling all following extensions in the list, always disable multiple extensions by looping through the list in reverse order. This lowers the execution time of the event handlers quite a bit if many extensions are installed. Thanks to Philippe Troin for identifying the problem and proposing the initial patch to change the extension order when reloading. Fixes https://gitlab.gnome.org/GNOME/gnome-shell/issues/177 https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/96 --- diff --git a/js/ui/extensionSystem.js b/js/ui/extensionSystem.js index 714537b5d..7fe275ec7 100644 --- a/js/ui/extensionSystem.js +++ b/js/ui/extensionSystem.js @@ -400,9 +400,9 @@ var ExtensionManager = class { // Find and disable all the newly disabled extensions: UUIDs found in the // old setting, but not in the new one. - this._enabledExtensions.filter( - item => !newEnabledExtensions.includes(item) - ).forEach(uuid => { + this._extensionOrder.filter( + uuid => !newEnabledExtensions.includes(uuid) + ).reverse().forEach(uuid => { this._callExtensionDisable(uuid); }); @@ -417,20 +417,19 @@ var ExtensionManager = class { } _onVersionValidationChanged() { - // we want to reload all extensions, but only enable - // extensions when allowed by the sessionMode, so - // temporarily disable them all - this._enabledExtensions = []; - - // The loop modifies the extensions map, so iterate over a copy - let extensions = [...this._extensions.values()]; - for (let extension of extensions) - this.reloadExtension(extension); - this._enabledExtensions = this._getEnabledExtensions(); + // Disabling extensions modifies the order array, so use a copy + let extensionOrder = this._extensionOrder.slice(); - this._enabledExtensions.forEach(uuid => { - this._callExtensionEnable(uuid); + // Disable enabled extensions in the reverse order first to avoid + // the "rebasing" done in _callExtensionDisable... + extensionOrder.slice().reverse().forEach(uuid => { + this._callExtensionDisable(uuid); }); + + // ...and then reload and enable extensions in the correct order again. + [...this._extensions.values()].sort((a, b) => { + return extensionOrder.indexOf(a.uuid) - extensionOrder.indexOf(b.uuid); + }).forEach(extension => this.reloadExtension(extension)); } _loadExtensions() {